package ija.xls.notation;

import ija.model.basis.Position;

import java.io.Serializable;

/**
 * Třída reprezentuje obecně souřadnice na šachovnici.
 * 
 * @author Radek Necas, xnecas18
 */
public class DeskCoordinate implements Serializable {

	protected char column;
	protected int row;

	/**
	 * 
	 * @param c
	 *            sloupec
	 * @param r
	 *            řádek
	 */
	public DeskCoordinate(char c, int r) {
		this.setColumn(c);
		this.setRow(r);
	}

	public DeskCoordinate(int x, int y) {
		this.setX(x);
		this.setY(y);
	}

	public DeskCoordinate(String s) {
		this.setFromString(s);
	}

	public DeskCoordinate(Position p) {
		this.column = p.getColumnChar();
		this.row = p.getRowNumber();
	}

	/**
	 * Nastavení sloupce
	 * 
	 * @param c
	 *            sloupec na který má být souřadnice nastavena
	 */
	public void setColumn(char c) {
		this.column = c;
	}

	/**
	 * Nastavení řádku
	 * 
	 * @param r
	 *            řádek, na který má být souřadnice nastavena.
	 */
	public void setRow(int r) {
		this.row = r;
	}

	public void setX(int x) {
		this.setRow(x + 1);
	}

	public void setY(int x) {
		this.setColumn((char) ('a' + x));
	}

	public int getX() {
		return (this.getRow() - 1);
	}

	public int getY() {
		return (this.getColumn() - 'a');
	}

	public boolean setFromString(String s) {
		String n = s.toLowerCase();

		if (n.length() >= 2) {
			this.column = n.charAt(0);
			this.row = n.charAt(1) - '0';
			return true;
		}

		return false;
	}

	/**
	 * 
	 * @return sloupec souřadnice
	 */
	public char getColumn() {
		return this.column;
	}

	/**
	 * 
	 * @return řádek souřadnice
	 */
	public int getRow() {
		return this.row;
	}

	@Override
	public String toString() {
		return ("" + this.column + this.row);
	}

	@Override
	public boolean equals(Object o) {
		if (o instanceof DeskCoordinate) {
			DeskCoordinate coord = (DeskCoordinate) o;
			if (coord.getColumn() == this.column && coord.getRow() == this.row) {
				return true;
			}
		}

		return false;
	}

	@Override
	public int hashCode() {
		int hash;
		hash = 10 * (this.column - 'a') + this.row;
		return hash;
	}

}
